﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using System.Collections;
using Caixa.Model;
using Caixa.DB;
using Caixa.Model.Interface;

namespace Caixa.DAO
{
	public abstract class PessoaDAO<M> where M : Pessoa
	{
		#region " Methods "

		#region " Get Methods "

		protected static M GetByID(int id)
		{
			M p = default(M);

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}
					FROM {0}
					WHERE
						{1} = :{1} AND
						{2} = :{2}
				",
					Pessoa.Fields.TABELA,
					Pessoa.Fields.ID,
					Pessoa.Fields.TIPOPESSOA,
					Pessoa.Fields.NOME,
					Pessoa.Fields.ENDERECO,
					Pessoa.Fields.NUMERO,
					Pessoa.Fields.BAIRRO,
					Pessoa.Fields.CIDADE,
					Pessoa.Fields.ESTADO,
					Pessoa.Fields.TELEFONE
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Pessoa.Fields.ID, id));
				parms.Add(db.GetParameter(Pessoa.Fields.TIPOPESSOA, Activator.CreateInstance<M>().TipoPessoa));

				// Executa a query no Conta de dados
				IEnumerator data = db.SelectSqlDr(SQL, parms.ToArray()).GetEnumerator();

				// Converte o resultado do Conta de dados em objeto				
				p = (DAHelper.ToModel<Pessoa>(data, Activator.CreateInstance<M>()) as M);
			}

			return p;
		}

		protected static bool Existe(int id)
		{
			return (GetByID(id) != null);
		}

		#endregion

		#region " Management Methods "



		#endregion

		#region " DDL Methods "

		protected static int Insert(M p)
		{
			int newID = 0;

			using (DAHelper db = new DAHelper())
			{
				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Pessoa.Fields.TIPOPESSOA, p.TipoPessoa));
				parms.Add(db.GetParameter(Pessoa.Fields.NOME, p.Nome));
				parms.Add(db.GetParameter(Pessoa.Fields.ENDERECO, p.Endereco));
				parms.Add(db.GetParameter(Pessoa.Fields.NUMERO, p.Numero));
				parms.Add(db.GetParameter(Pessoa.Fields.BAIRRO, p.Bairro));
				parms.Add(db.GetParameter(Pessoa.Fields.CIDADE, p.Cidade));
				parms.Add(db.GetParameter(Pessoa.Fields.ESTADO, p.Estado));
				parms.Add(db.GetParameter(Pessoa.Fields.TELEFONE, p.Telefone));

				// Executa a query no Conta de dados e retorna o ID do novo registro
				newID = db.InsertSql(Pessoa.Fields.TABELA, parms.ToArray());
			}

			return newID;
		}

		protected static bool Update(M p)
		{
			bool success = false;

			using (DAHelper db = new DAHelper())
			{
				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Pessoa.Fields.TIPOPESSOA, p.TipoPessoa));
				parms.Add(db.GetParameter(Pessoa.Fields.NOME, p.Nome));
				parms.Add(db.GetParameter(Pessoa.Fields.ENDERECO, p.Endereco));
				parms.Add(db.GetParameter(Pessoa.Fields.NUMERO, p.Numero));
				parms.Add(db.GetParameter(Pessoa.Fields.BAIRRO, p.Bairro));
				parms.Add(db.GetParameter(Pessoa.Fields.CIDADE, p.Cidade));
				parms.Add(db.GetParameter(Pessoa.Fields.ESTADO, p.Estado));
				parms.Add(db.GetParameter(Pessoa.Fields.TELEFONE, p.Telefone));

				// Define a cláusula where do Update
				string sWhere = string.Format("{0} = {1}", Pessoa.Fields.ID, p.ID);

				// Executa a query no Conta de dados e retorna se foi atualizado com sucesso
				success = db.UpdateSql(Pessoa.Fields.TABELA, parms.ToArray(), sWhere);
			}

			return success;
		}

		protected static bool Delete(M p)
		{
			bool success = false;

			using (DAHelper db = new DAHelper())
			{
				// Define a cláusula where do Delete
				string sWhere = string.Format("{0} = {1}", Pessoa.Fields.ID, p.ID);

				// Executa a query no Conta de dados e retorna se o registro foi excluido com sucesso
				success = db.DeleteSql(Pessoa.Fields.TABELA, sWhere);
			}

			return success;
		}

		#endregion

		#endregion
	}
}
